#include "task_schedule.h"

static volatile TaskStruct TaskList[Task_MAX_NUM];
static volatile uint32_t TaskListCurNum = 0;


/**
 * @desc  : 任务注册函数
 * @date  : 2025-03-28
 * @author: AnRui
 * @param : taskName - {参数说明}: 任务名
 * @param : taskTimRload - {参数说明}: 时间片重载值(多久执行一次)
 * @param : pTaskFuncCb - {参数说明}:  任务对应的执行函数(函数中不要出现delay)
 * @note  : 向任务列表中添加任务
 */
TaskErrorCode TaskDrvReg(char* taskName, uint16_t taskTimRload, void (*pTaskFuncCb)(void))
{
    // 任务数量检查
    if (TaskListCurNum >= Task_MAX_NUM) return TASK_LIST_FULL;
    TaskList[TaskListCurNum++] = (TaskStruct) {
        .taskName = taskName,
        .taskScheduleFlag = TASK_SUSPENDED,
        .taskTimCount = taskTimRload,
        .taskTimRload = taskTimRload,
        .pTaskFuncCb = pTaskFuncCb
    };
    return TASK_SUCCESS;
}

/**
 * @desc  : 根据时间节拍更新任务
 * @date  : 2025-03-28
 * @author: AnRui
 * @note  : 依托systick中断 每1ms 对任务列表中的任务进行检查
 *          如果任务处于非调度状态 任务的计数值-1 如果结果为0 那么就修改任务状态为调度态
 */
static void TaskDrvProcessTicks(void)
{
    for (uint32_t i = 0; i < TaskListCurNum; i++) {
        if (TaskList[i].taskTimCount) {
            TaskList[i].taskTimCount--;
            if (TaskList[i].taskTimCount == 0) {
                TaskList[i].taskScheduleFlag = TASK_ACTIVE;
                TaskList[i].taskTimCount = TaskList[i].taskTimRload;
            }
        }
    }
}


/**
 * @desc  : 开启任务调度
 * @date  : 2025-03-28
 * @author: AnRui
 * @note  : 逐一检查任务列表 如果任务处于调度状态就执行对应的函数 缺少优先级
 */
void TaskDrvStartSchedule(void)
{
    for (uint32_t i = 0; i < TaskListCurNum; i++) {
        if (TaskList[i].taskScheduleFlag == TASK_ACTIVE)       // 判断时间片标志
        {
            TaskList[i].taskScheduleFlag = TASK_SUSPENDED;     // 标志清零
            TaskList[i].pTaskFuncCb();                         // 执行调度业务功能模块
        }
    }
}



/**
 * @desc  : 任务调度器初始化
 * @date  : 2025-03-28
 * @author: AnRui
 * @note  : 向滴答定时器 注册任务调度函数
 */
void TaskDrvInit(void)
{
    SystickHandlerCallBackFuncReg(TaskDrvProcessTicks);
}
